let MONSTER_POS = [
    [747, 998],
    [-785, 1027],
    [-420, 140],
    [320, 111],
    [520, 520],
    [1000, 1000],
    [-320, -111],
    [-520, -520],
    [1000, -1000],
    [747, -998],
];

//游戏状态
const STATE_RUN = 1; //进行
const STATE_PAUSE = 2; //暂停

cc.Class({
    extends: cc.Component,

    properties: {
        map1: cc.Node, //结点类型
        map2: cc.Node,
        bg: {
            type: cc.Prefab, //预制体类型
            default: [], //默认值
        },
        decorate: {
            type: cc.Prefab, //预制体类型
            default: [], //默认值
        },
        role: cc.Node,
        gamePanel: cc.Node,
        joystick: cc.Node,

        skillUI: cc.Prefab,
        turnCnt: cc.Label,
        monsterCnt: cc.Label,
        resultUI: cc.Prefab,
        mapUI: cc.Prefab,
        
        panelEffect: cc.Prefab,
        effectLayer: cc.Node,

        enemy: {
            //同一类型的一对多绑定
            type: cc.Prefab, //结点类型
            default: [], //默认值
        },
        
    },


    //技能选择页面
    showskillUI() {
        if (cc.find("Canvas/SkillSelectView")) return;
        this.pause();
        let node = cc.instantiate(this.skillUI); //创建技能选择页面
        cc.find("Canvas").addChild(node); //添加到场景
        node.cbfunc = () => {//技能选择页面关闭时，恢复游戏
            // this.resume();
            this.newTurn();
        };
    },

    newTurn() {
        this.resume();
        this.turnCnt.string++;
        this.curMonsterCnt = 0;
        g_Bullet.clear();
    },

    pause() {
        this.gamestate = STATE_PAUSE;
    },

    resume() {
        this.gamestate = STATE_RUN;
    },

    isPalse() {
        return this.gamestate == STATE_PAUSE;
    },

    //同步角色移动
    syncRoleMove(hd) {
        //cc.find("")  查找当前结点下的某个结点
        //结点.getComponent(组件名)  获取结点上的某个组件
        let node = cc.find("Canvas/gamePanel/player");
        let script = node.getComponent("role");
        script.setth(hd);
    },
    // LIFE-CYCLE CALLBACKS:

    //设置相机跟随角色
    setCameraFollow() {
        let camera = cc.find("Canvas/Main Camera");
        let script = camera.getComponent("camera");
        script.setFollow(this.role);
    },

    //创建野怪
    createMonster() {
        if (this.curMonsterCnt >= this.maxMonsterCnt) return;
        this.curMonsterCnt++;

        //Math.random()  随机数
        let idx = Math.floor(Math.random() * this.enemy.length);
        let pos = MONSTER_POS[Math.floor(Math.random() * MONSTER_POS.length)]; //随机位置
        let monster = cc.instantiate(this.enemy[idx]);
        this.gamePanel.addChild(monster);
        //怪物坐标以pos为圆心，半径为5的圆内随机生成一个点
        monster.x = pos[0] + (-50 + Math.floor(Math.random() * 100));
        monster.y = pos[1] + (-50 + Math.floor(Math.random() * 100));
        g_Monster.addMonster(monster);
        monster.target = this.role;
        this.refreshMonsterCnt();
    },

    createMap() {
        //创建地图
        let idx = g_Mapid - 1;
        let node = cc.instantiate(this.bg[idx]); //把预制体实例化成一个结点
        this.map1.addChild(node); //结点1.addchild(结点2) 把结点2变成结点1的子结点
        let node1 = cc.instantiate(this.decorate[idx]);
        this.map2.addChild(node1);
    },

    //销毁
    onDestroy() {
        g_Slot.off(g_Lister.monster_die);
        g_Bullet.clear();
        g_Monster.clear();
        g_Buff.clear();
    },

    onLoad() {
        cc.director.getCollisionManager().enabled = true; //开启碰撞检测,组件才会产生碰撞事件，结点不会产生碰撞事件
    },

    onTouchMove(event) {
        let pos = event.getLocation();

        // 获取触摸位置相对于摇杆节点的坐标
        //结点.parent  获取结点的父结点
        //结点.convertToNodeSpaceAR(世界坐标)  将世界坐标转换为当前结点坐标系的相对坐标
        pos = this.joystick.parent.convertToNodeSpaceAR(pos);
        let r = pos.mag(); //求向量的长度

        r = r > 120 ? 120 : r; //限制摇杆的移动范围(0<=r<=120)
        let hd = cc.v2(1, 0).signAngle(pos); //求向量的角度;

        this.syncRoleMove(hd);

        //cc.log(hd*180/Math.PI)
        let x = r * Math.cos(hd); //分解到x轴方向的长度
        let y = r * Math.sin(hd); //分解到y轴方向的长度
        this.joystick.setPosition(x, y); //更新遥杆位置，鼠标点击移动
    },

    onTouchEnd() {
        this.joystick.setPosition(0, 0); //设置遥杆松开，回归原位
        this.syncRoleMove(0);
    },

    onListen() {
        //设置和处理摇杆（joystick）的触摸事件
        /*
      `TOUCH_START`: 当触摸开始时触发。在此，它会在控制台打印 "点击开始"，并设置摇杆的位置为 `(100, 200)`。
                但这里有一点需要注意：通常，摇杆的位置会根据玩家的触摸位置来动态设置，而不是直接设置为一个固定的值。
      `TOUCH_MOVE`: 当触摸移动时触发。在此，它会在控制台打印 "点击move"。
      `TOUCH_END`: 当触摸结束时触发。在此，它会在控制台打印 "点击end"。
      `TOUCH_CANCEL`: 当触摸因系统或其他原因被取消时触发。在此，它会在控制台打印 "点击cancel"。
      */

        // 监听触摸开始事件
        this.joystick.on(cc.Node.EventType.TOUCH_START, (event) => {
            //cc.log("点击开始");
        });
        // 监听触摸移动事件
        this.joystick.on(cc.Node.EventType.TOUCH_MOVE, (event) => {
            this.onTouchMove(event);
        });
        // 监听触摸结束和取消事件
        this.joystick.on(cc.Node.EventType.TOUCH_END, () => {
            this.onTouchEnd();
        });
        this.joystick.on(cc.Node.EventType.TOUCH_CANCEL, () => {
            this.onTouchEnd();
        });
        g_Slot.on(g_Lister.monster_die, () => { 
            this.totalkill++;
            this.refreshMonsterCnt();
        });
    },

    // 检查怪物是否全部死亡，选择新技能后进入下一波
    checkNextTurn() {
        let cnt = g_Monster.getAllMonster().length;
        if (this.curMonsterCnt >= this.maxMonsterCnt && cnt <= 0) {
            this.showskillUI();
        }
    },

    
    // 更新剩余怪物数量
    refreshMonsterCnt() {
        this.monsterCnt.string = g_Monster.getAllMonster().length;    
    },


    // 游戏结束
    gameOver() {
        this.pause();
        let node = cc.instantiate(this.resultUI);
        cc.find("Canvas").addChild(node);
        // cc.log(node.getComponent("ResultView"));
        node.getComponent("ResultView").init(g_Mapid,this.turnCnt.string, this.totalkill, Math.floor(this.liveTime));
        
    },

    //子弹打到野怪触发特效
    playEffect(id, pos = cc.v2(0, 0)) {
        let node = cc.instantiate(this.panelEffect);
        this.effectLayer.addChild(node);
        node.setPosition(pos);
        let anim = node.getComponent(cc.Animation);
        anim.play("hit" + id);
        anim.on(cc.Animation.EventType.FINISHED, () => { 
            node.destroy();
        })
    },

    start() {
        // this.pause(); //游戏的初始运行状态为运行状态
        
        window.g_Game = this;
        g_Audio.playMusic();
        this.turnCnt.string = 0;
        this.monsterCnt.string = 0;
        
        this.createMap();
        this.setCameraFollow();
        this.onListen();
        this.showskillUI();
        /**?
         * 1.一波上限20只野怪
         * 2.每秒产生一只
         */
        this.maxMonsterCnt = 20;
        this.curMonsterCnt = 0;
        this.totalkill = 0;
        this.time = 0;
        this.liveTime = 0;
        //this.schedule(this.createMonster, 1); //每隔1秒调用一次createMonster方法，定时器schedule(对象,间隔时间)
    },

    update(dt) {
        //dt：上一帧与当前帧的时间差
        this.checkNextTurn();
        if (this.isPalse()) return;

        this.time += dt;
        this.liveTime += dt;
        if (this.time >= 1) {
            this.time -= 1;
            this.createMonster();
            this.createMonster();
        }

        g_Monster.update(dt);
        g_Bullet.update();
        g_Buff.update(dt);
    },
});
